1. 연산자의 이해
연산자는 연산을 수행하는 기호를 말한다. 사칙 연산에 사용되는(+, -, *, /) 등 사칙연산을 포함한 다른 연산자도 Java에서 사용한다
연산자와 피 연산자
- 연산자 : 연산을 수행하는 기호( +, -, …등등)
- 피 연산자 : 연산자의 수행 대상 (상수, 리터럴, 변수 등)
2. 연산자의 종류
종류 | 연산자 | 우선순위 |
단항 연산자 | ++ — + - ! ~ | 높음 |
산술 연산자 | * / % | ㅤ |
ㅤ | + - ( 곱하기 -1 ) | ㅤ |
ㅤ | << >> | ㅤ |
비교 연산자 | > >= instanceof | ㅤ |
ㅤ | == != | ㅤ |
논리 연산자 | & ^ | && || (순서대로 우선순위 높음) | ㅤ |
삼항 연산자 | ? : ex) (a>b) ? c : d | ㅤ |
대입 연산자 | = += -= *= /= %= <<= &= ^= |= | 낮음 |
산술 변환
피 연산자의 타입이 서로 다르다면 연산 전에 형 변환 연산자로 타입을 일치 시켜야 한다.
자동으로 형 변환이 되는 경우 두 피 연산자의 타입 중에서 더 큰 타입으로 일치 시킨다.
int a = 10; float b = 10.24f; float c = a + b; //큰 타입으로 형 변환 시, 형 변환 연산자 생략 가능 //or float c = float(a) + b
😜세가지만 기억하기
- 산술 연산 때는 피 연산자의 타입이 같아야 한다.
- 피 연산자의 타입이 int보다 작으면 int타입으로 변환된다.
- 연산 결과와 저장 변수의 타입은 다를 수 있다.
- 피 연산자가 int보단 크고 서로 다르면 더 큰 피 연산자 타입으로 변환된다.
//case1 너무 큰 자료형 byte a = 110; byte b = 110; byte err_byte = a+b; //에러 byte correct_byte = byte(a+b); //case2 연산 결과가 int, 자료형은 long 에러가 발생할까? long err_long = 2000000 * 2000000; //1385447424(overflow) long correct_long = 2000000L * 2000000L; long correct_long = (long)2000000 * (long)2000000; //case3 계산 순서의 영향 int error_order = 1000000 * 1000000 / 1000000; //overflow, 곱하고 나눴기 때문에 이미 overflow된 값이다.
단항 연산자
- 증감 연산자 ( ++ — )
- ++ → 피 연산자의 값을 1 증가 시킨다.
- — → 피 연산자의 값을 1 감소 시킨다.
1.1 코드로 보는 증감 연산자
public class Operator1 { public static void main(String[] args){ int a = 10; int b = 10; System.out.println("뒤에있는 ++" + a++); //10 System.out.println("앞에있는 ++" + ++b); //11 } }
- 뒤에 붙어있는 증감 연산자는 변수를 먼저 읽어오고 수식을 더한다
- 앞에 있는 연산자는 더하고 변수를 읽어온다.
- 부호 연산자 ( + - )
int a = 10; a = -a // -10
- 부호 연산자는 피 연산자의 부호를 반대로 변경한 결과를 반환한다.
- 산술 연산자
public class Operator2 { public static void main(String[] args){ int a = 10; int b = 3; System.out.printf("%d + %d = %d\n", a, b, a + b); System.out.printf("%d - %d = %d\n", a, b, a - b); System.out.printf("%d * %d = %d\n", a, b, a * b); System.out.printf("%d / %d = %d\n", a, b, a / b); System.out.printf("%d / %f = %f\n", a, (float)b, a / (float)b); System.out.printf("%d / %d = %d\n", a, b, a % b); } } //정답 10 + 3 = 13 10 - 3 = 7 10 * 3 = 30 10 / 3 = 3 10 / 3.000000 = 3.333333 10 % 3 = 1
- 비교 연산자( 대소 비교 → < > 등가 비교 → == != )
int a = 10; int b = 20; a > b //false a < b //true a >= b //false a <= b //true a == b //false a != b //true //주의사항 int a = 10; float b = 10f; a == b //true int a = 0.1; float b = 0.1f; a == b //false //실수형은 근삿값으로 저장되기 때문에 오차가 발생할 수 있기때문에 false이다. //따라서 실수를 비교할떄는 float로 변환해주고 비교해야한다.
🙆🏻 주의 사항
- 문자열의 비교는 String 클래스에서 제공하는 equals() 함수로 비교해야 함.
public class OperatorStr { public static void main(String[] args){ String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1==str2); //false System.out.println(str1.equals(str2)); //true } }
비교 연산자 “==”는 두 문자열이 완벽히 같은 지만 판단하기 때문에 false가 출력 된다.
- 논리 연산자( &&, ||, ! )
- && ( AND 연산자 )
- || ( OR 연산자 )
- ! ( NOT 연산자 )
🤪 헷갈리는 논리 연산자 한번에 보기
A | B | A && B | A || B | ! A , ! B |
true | true | true | true | false, false |
true | false | flase | true | false, true |
false | false | false | false | true, true |
😝 논리 연산자와 비교 연산자를 활용해보기
import java.util.*; public class Operatormix { public static void main(String args[]){ Scanner scan = new Scanner(System.in); System.out.println("한개의 문자를 입력하세요"); String str1 = scan.nextLine(); char ch = str1.charAt(0); if ('0'<=ch && ch<='9'){ System.out.println("숫자입니다."); } if ('a'<=ch && ch<= 'z' || 'A'<=ch && ch<='Z'){ System.out.println("영문자 입니다"); } } }
팁
- AND 연산의 경우에는 거짓 구문일 확률이 높은 구문을 왼쪽에
- OR 연산의 경우에는 참 구문을 왼쪽에 두면 컴파일 속도가 빨라 질 수 있습니다.
- 비트 연산자 ( & | ^ ~ << >> )
- & (AND 연산자) → 서로 같을 때만 1
- | (OR 연산자) → 둘중 한개만 1이여도 1
- ^ (XOR 연산자) → 두 비트가 같으면 0 다르면 1
6.1 한눈에 알아보는 비트 연산자
x | y | x & y | x | y | x ^ y | ~x, ~y |
0 | 0 | 0 | 0 | 0 | 1, 1 |
1 | 0 | 0 | 1 | 1 | 0, 1 |
0 | 1 | 0 | 1 | 1 | 1, 0 |
1 | 1 | 1 | 1 | 0 | 0, 0 |
6.2 쉬프트 연산자
- 비트 이동 연산자라고 생각하면 된다.
//어려운 부분이 많으니 개념만 익히고 가도록 하자 1011(2) 1011<<1 -> 10110 1011>>1 -> 101
<< 연산은 * 2 n승과 같고 >> 연산은 / 2 n승과 같다.
- 그 외 연산자
- ? : 연산자 ( 물음표 앞에 있는 수식이 true이면 따옴표 왼쪽 값을, false면 오른쪽 값을 출력한다)
int a = 10; int b = 20; ( a > b ) ? 10 : 20; //20 ( a < b ) ? 10 : 20; //10
- =, op= 연산자(복합 대입 연산자)
int a = 10; int b = 20; a = a + b //a+b의 값을 a에 저장 a += b //a+b의 값을 a에 저장 a -= a *=
이와 같이 다른 연산자(op)와 결합하여 op= 와 같은 방식으로 나타낼 수 있다.